/**
 * @description @babel/core配置文件
 * @extends https://www.babeljs.cn/docs/presets
 */

/**
 * 构建产物
 *
 * 一.不使用 runtime
 * 不使用 runtime + 标准 targets + 配置 external：13kb
 * 不使用 runtime + 标准 targets + 不配置 external：13kb
 * 不使用 runtime + 严格 targets + 配置 external：61kb
 * 不使用 runtime + 严格 targets + 不配置 external：61kb
 * targets 影响 48kb
 * external 影响 0kb
 *
 * 二.使用 runtime
 * 使用 runtime + 标准 targets + 配置 external：13kb
 * 使用 runtime + 标准 targets + 不配置 external：13kb
 * 使用 runtime + 严格 targets + 配置 external：104kb
 * 使用 runtime + 严格 targets + 不配置 external：104kb ✅
 * targets 影响 91kb
 * external 影响 0kb
 */

module.exports = {
  // 1.babel预设
  presets: [
    [
      '@babel/preset-env', // 使用 @babel/preset-env 编译预设
      {
        useBuiltIns: 'usage', // 采用 core-js 的 polyfill 方案，并且按需降级（另可用 entry、usage、false）
        corejs: 3, // core-js 版本为 v3
        debug: false // 可打印根据 targets 过滤出的的 plugins 和 presets
      }
    ],
    [
      '@babel/preset-typescript', // 使用 @babel/preset-typescript 编译 ts
      {
        allExtensions: true // 支持所有文件扩展名，否则在 vue 文件中使用 ts 会报错
      }
    ]
  ],
  // 2.babel插件
  plugins: [
    [
      '@babel/plugin-proposal-decorators', // 允许 babel 转换装饰器语法
      { legacy: true }
    ],
    [
      '@babel/plugin-transform-runtime', // 使用 @babel/plugin-transform-runtime 插件
      {
        /**
         * https://github.com/babel/babel/issues/10008
         * 问题：plugins 在 presets 之前运行，导致 @babel/plugin-transform-runtime 会提前 polyfill 所有代码，从而使得 @babel/preset-env 中的 targets 无效，不会按需 polyfill
         * 当前版本：@babel/plugin-transform-runtime 现在共享 @babel/preset-env 提供的 targets，可忽略该问题
         */
        /**
         * @babel/plugin-transform-runtime 内部代码包含三种
         * - core-js：核心 polyfill
         * - regenerator：async/await 的 polyfill
         * - helper：某些语法的 polyfill，例如 class
         * 所以 @babel/plugin-transform-runtime 本质上只是一个 polyfill，ES6 转 ES5 还是需要 @babel/preset-env 执行
         */
        corejs: 3 // 使用 @babel/runtime-corejs3 替代 core-js，解决全局 API 污染式注入
      }
    ]
  ]
}
